import CryptoJS from 'crypto-js';
// @ts-ignore
import JSEncrypt from 'jsencrypt';

// 密钥对生成 http://web.chacuo.net/netrsakeypair
const publicKey = import.meta.env.VITE_APP_RSA_PUBLIC_KEY;
const privateKey = import.meta.env.VITE_APP_RSA_PRIVATE_KEY;

/**
 * 随机生成32位的字符串
 * @param length
 */
function generateRandomString(length = 32) {
  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  const charactersLength = characters.length;
  for (let i = 0; i < length; i++) {
    result += characters.charAt(Math.floor(Math.random() * charactersLength));
  }
  return result;
}

/**
 * 随机生成aes 密钥
 */
export function generateAesKey() {
  return generateRandomString();
}

/**
 * 使用密钥对数据进行加密
 * @param message
 * @param aesKey
 */
export function encryptWithAes(message: string, aesKey: string) {
  const key = CryptoJS.enc.Utf8.parse(aesKey);
  const encrypted = CryptoJS.AES.encrypt(message, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  });
  return encrypted.toString();
}

/**
 * 使用密钥对数据进行解密
 * @param message
 * @param aesKey
 */
export function decryptWithAes(message: string, aesKey: string) {
  const key = CryptoJS.enc.Utf8.parse(aesKey);
  const decrypted = CryptoJS.AES.decrypt(message, key, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7,
  });
  return decrypted.toString(CryptoJS.enc.Utf8);
}

/**
 * 加密base64
 */
export function encryptBase64(str: string) {
  return btoa(
    encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (match, p1) => {
      return String.fromCharCode(parseInt(p1, 16));
    }),
  );
}

/**
 * 解密base64
 */
export function decryptBase64(str: string) {
  try {
    return decodeURIComponent(
      atob(str)
        .split('')
        .map((c) => {
          return `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`;
        })
        .join(''),
    );
  } catch (e) {
    return str;
  }
}

/**
 * RSA加密
 * @param txt 要加密的文本
 */
export function encrypt(txt: string) {
  try {
    // 由于在微应用中直接引入jsencrypt可能会有问题，这里使用简化的RSA加密实现
    // 实际项目中应根据后端要求实现完整的RSA加密
    if (!publicKey) {
      return txt;
    }
    // 这里仅作为示例，实际项目需要正确实现RSA加密
    // 在login-app的package.json中已经有jsencrypt依赖，可以直接使用
    const encryptor = new JSEncrypt();
    encryptor.setPublicKey(publicKey);
    return encryptor.encrypt(txt) || txt;
  } catch (error) {
    console.error('Encryption error:', error);
    return txt;
  }
}

/**
 * RSA解密
 * @param txt 要解密的文本
 */
export function decrypt(txt: string) {
  try {
    if (!privateKey) {
      return txt;
    }
    // 在微应用中解密不常用，这里简化处理
    const encryptor = new JSEncrypt();
    encryptor.setPrivateKey(privateKey);
    return encryptor.decrypt(txt) || txt;
  } catch (error) {
    console.error('Decryption error:', error);
    return txt;
  }
}

/**
 * md5哈希算法
 */
export function MD5(message: string) {
  return CryptoJS.MD5(message).toString();
}
